#include "EffectTemplatePCH.h"
#include "EffectParameter.h"

// Template specialization for the setters for an effect parameter
// Specialize on glm vector and matrix types.
// Currently supports int, float, double, 2, 3, and 4 component vectors and 
// 2x2, 3x3, and 4x4 matrix types.

template<>
void EffectParameter::Set<bool>( const bool& value )
{
    SetBoolValue( &value, 1 );
}

template<>
void EffectParameter::Set<int>( const int& value )
{
    SetIntValue( &value, 1 );
}

template<>
void EffectParameter::Set<float>( const float& value )
{
    SetFloatValue( &value, 1 );
}

template<>
void EffectParameter::Set<double>( const double& value )
{
    SetDoubleValue( &value, 1 );
}

template<>
void EffectParameter::Set<glm::bvec2>( const glm::bvec2& value )
{
    SetBoolValue( glm::value_ptr(value), 2 );
}

template<>
void EffectParameter::Set<glm::bvec3>( const glm::bvec3& value )
{
    SetBoolValue( glm::value_ptr(value), 3 );
}

template<>
void EffectParameter::Set<glm::bvec4>( const glm::bvec4& value )
{
    SetBoolValue( glm::value_ptr(value), 4 );
}

template<>
void EffectParameter::Set<glm::ivec2>( const glm::ivec2& value )
{
    SetIntValue( glm::value_ptr(value), 2 );
}

template<>
void EffectParameter::Set<glm::ivec3>( const glm::ivec3& value )
{
    SetIntValue( glm::value_ptr(value), 3 );
}

template<>
void EffectParameter::Set<glm::ivec4>( const glm::ivec4& value )
{
    SetIntValue( glm::value_ptr(value), 4 );
}

template<>
void EffectParameter::Set<glm::vec2>( const glm::vec2& value )
{
    SetFloatValue( glm::value_ptr(value), 2 );
}

template<>
void EffectParameter::Set<glm::vec3>( const glm::vec3& value )
{
    SetFloatValue( glm::value_ptr(value), 3 );
}

template<>
void EffectParameter::Set<glm::vec4>( const glm::vec4& value )
{
    SetFloatValue( glm::value_ptr(value), 4 );
}

template<>
void EffectParameter::Set<glm::dvec2>( const glm::dvec2& value )
{
    SetDoubleValue( glm::value_ptr(value), 2 );
}

template<>
void EffectParameter::Set<glm::dvec3>( const glm::dvec3& value )
{
    SetDoubleValue( glm::value_ptr(value), 3 );
}

template<>
void EffectParameter::Set<glm::dvec4>( const glm::dvec4& value )
{
    SetDoubleValue( glm::value_ptr(value), 4 );
}

template<>
void EffectParameter::Set<glm::bool2x2>( const glm::bool2x2& value )
{
    SetBoolValue( glm::value_ptr(value), 4 );
}

template<>
void EffectParameter::Set<glm::bool3x3>( const glm::bool3x3& value )
{
    SetBoolValue( glm::value_ptr(value), 9 );
}

template<>
void EffectParameter::Set<glm::bool4x4>( const glm::bool4x4& value )
{
    SetBoolValue( glm::value_ptr(value), 16 );
}

template<>
void EffectParameter::Set<glm::int2x2>( const glm::int2x2& value )
{
    SetIntValue( glm::value_ptr(value), 4 );
}

template<>
void EffectParameter::Set<glm::int3x3>( const glm::int3x3& value )
{
    SetIntValue( glm::value_ptr(value), 9 );
}

template<>
void EffectParameter::Set<glm::int4x4>( const glm::int4x4& value )
{
    SetIntValue( glm::value_ptr(value), 16 );
}

template<>
void EffectParameter::Set<glm::mat2x2>( const glm::mat2x2& value )
{
    SetFloatValue( glm::value_ptr(value), 4 );
}

template<>
void EffectParameter::Set<glm::mat3x3>( const glm::mat3x3& value )
{
    SetFloatValue( glm::value_ptr(value), 9 );
}
template<>
void EffectParameter::Set<glm::mat4x4>( const glm::mat4x4& value )
{
    SetFloatValue( glm::value_ptr(value), 16 );
}

template<>
void EffectParameter::Set<glm::dmat2x2>( const glm::dmat2x2& value )
{
    SetDoubleValue( glm::value_ptr(value), 4 );
}

template<>
void EffectParameter::Set<glm::dmat3x3>( const glm::dmat3x3& value )
{
    SetDoubleValue( glm::value_ptr(value), 9 );
}
template<>
void EffectParameter::Set<glm::dmat4x4>( const glm::dmat4x4& value )
{
    SetDoubleValue( glm::value_ptr(value), 16 );
}
